package com.rw.tool.util.io.file.property;

import com.rw.tool.util.io.file.wrapper.FileLambdaQueryWrapper;
import com.rw.tool.util.io.file.wrapper.LambdaGetter;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 根据ID列表过滤
 */
public class FilterIdGetter<T, F> implements IdListGetter<F> {
    /**
     * id的列表
     */
    private final List<String> idList;

    /**
     * 自增的id列表
     */
    private final List<String> autoIncrementId;

    /**
     * 字段名称获取器
     */
    private final NameGetter<F> nameGetter;

    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param idList          id列表
     * @param autoIncrementId 自增id
     */
    public FilterIdGetter(List<String> idList, List<String> autoIncrementId, NameGetter<F> nameGetter) {
        this.idList = idList;
        this.autoIncrementId = autoIncrementId;
        this.nameGetter = nameGetter;
    }

    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param id            id
     * @param autoIncrement 是否自增
     */
    public FilterIdGetter(String id, boolean autoIncrement, NameGetter<F> nameGetter) {
        this(Collections.singletonList(id), parseIncrementId(id, autoIncrement), nameGetter);
    }

    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param idList id列表
     */
    public FilterIdGetter(List<String> idList, NameGetter<F> nameGetter) {
        this(idList, Collections.emptyList(), nameGetter);
    }


    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param id id
     */
    public FilterIdGetter(String id, NameGetter<F> nameGetter) {
        this(Collections.singletonList(id), Collections.emptyList(), nameGetter);
    }

    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param idLambda      id
     * @param autoIncrement 是否自增
     */
    public FilterIdGetter(LambdaGetter<T> idLambda, boolean autoIncrement, NameGetter<F> nameGetter) {
        this(Collections.singletonList(FileLambdaQueryWrapper.parseLambdaName(idLambda)),
                parseIncrementId(FileLambdaQueryWrapper.parseLambdaName(idLambda), autoIncrement), nameGetter);
    }


    /**
     * 声明一个根据id过滤的过滤器
     *
     * @param idLambda id
     */
    public FilterIdGetter(LambdaGetter<T> idLambda, NameGetter<F> nameGetter) {
        this(Collections.singletonList(FileLambdaQueryWrapper.parseLambdaName(idLambda)), Collections.emptyList(),
                nameGetter);
    }

    /**
     * 获得id列表
     *
     * @param properties 属性
     * @return id列表
     */
    @Override
    public List<IdProperty<F>> get(List<F> properties) {
        return properties.stream()
                .filter(prop -> idList.contains(nameGetter.getName(prop)))
                .map(prop -> new IdProperty<>(isAutoIncrement(nameGetter.getName(prop)), prop))
                .collect(Collectors.toList());
    }

    /**
     * 判断id是否是自增
     *
     * @param id id
     * @return 是否自增
     */
    private boolean isAutoIncrement(String id) {
        return autoIncrementId.contains(id);
    }

    private static List<String> parseIncrementId(String id, boolean isIncrement) {
        if (isIncrement) {
            return Collections.singletonList(id);
        } else {
            return Collections.emptyList();
        }
    }
}
